package com.qire.common;

import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;

import com.qire.common.basic.ObjectUtil;
import com.qire.common.constant.AdvertManage;
import com.qire.common.constant.DeviceConfigInfo;
import com.qire.common.model.entity.UserEntity;
import com.qire.common.receiver.NetWorkChangReceiver;
import com.qire.common.receiver.SimChangeReceiver;
import com.qire.common.utils.Logger;
import com.qire.common.utils.OSUtil;
import com.qire.common.utils.OkGoConfigHelper;
import com.qire.other.push.PushManage;
import com.qire.other.recorder.ComicActionRecorder;
import com.qire.other.thirdPlatform.AliQuickLoginPlatform;
import com.qire.other.thirdPlatform.WeChatPlatform;

/**
 * 初始化管理程序，负责 APP 全局相关的初始化和第三方的初始化，以避免权限问题导致的合规审查。
 * 该工具会在 MainActivity 中被使用，且一定在用户授权弹窗流程之后才做操作。
 * 并且只会操作一次，故可以理解为等同于app启动最初调用，需注意的是：这个生命周期并不包含MainActivity 的全部周期，
 * 如果在onCreate之间的操作与初始化有冲突，则需要注意后移。
 */
public final class InitManage {

    private static volatile boolean isInit = true;

    private InitManage() {
        throw new AssertionError("InitManage 不能实例化");
    }

    public static synchronized void init() {
        if (!isInit) {
            return;
        }

        isInit = false;

        SummerApp summerApp = SummerApp.summerApp();

        // 初始化APP配置信息
        initDeviceConfigBy(summerApp);

        // 初始化网络请求头，这个头还在webView中加载页面用了
        OkGoConfigHelper.initHeader(DeviceConfigInfo.info().versionName, DeviceConfigInfo.info().versionCode, DeviceConfigInfo.fetchChannel(summerApp));
        // okGo网络框架初始化
        OkGoConfigHelper.initOkGo(summerApp);

//        //定时任务队列初始化
//        TimeTaskQueue.QUEUE.init();

//
//        // MobSDK 分享
//        MobSDK.init(this);
//
//        // 全局配置初始化
////        GlobalConfig.init();
        // 用户行为统计
        String channelNo = "qr_" + OSUtil.getChannel(summerApp);
        ComicActionRecorder.preInit(summerApp, channelNo);
        ComicActionRecorder.init(summerApp, channelNo);

        // 极光推送初始化
        PushManage.init(summerApp);
        UserEntity.self.updatePushAlias();

        // 微信平台信息初始化
        WeChatPlatform.WeChat.init(summerApp);
        // 阿里手机一键登录平台初始化
        AliQuickLoginPlatform.QUICK.init(summerApp);

        // 初始化广告相关SDK
        AdvertManage.init(summerApp);


        /** 网络状态改变监听接受器 */
//        private NetWorkChangReceiver netWorkChangReceiver;
        /** SIM卡状态改变监听接受器 */
//        private SimChangeReceiver simChangeReceiver;

        summerApp.addActiveRegistrar(new NetWorkChangReceiver());
        // 注册关注sim卡状态切换
        summerApp.addActiveRegistrar(new SimChangeReceiver().addReadySimAction(AliQuickLoginPlatform.QUICK::checkAccelerateLogin));
    }

    private static void initDeviceConfigBy(SummerApp summerApp) {
        try {
            PackageManager pm = summerApp.getPackageManager();//拿到包的管理器
            //封装了所有的功能清单中的数据
            PackageInfo info = pm.getPackageInfo(summerApp.getPackageName(), 0);
            DeviceConfigInfo.init(info.versionCode, info.versionName);
            Logger.d("APP 初始化，成功加载版本号！当前appVersionCode：" + DeviceConfigInfo.info().versionCode + " 当前appVersionName:" + DeviceConfigInfo.info().versionName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 获得Application里面的的meta-data的值
     * @param metaDataName xml 配置中 元数据名
     * @return
     */
    public String getMetaDataToString(String metaDataName, SummerApp summerApp) {
        // TODO Auto-generated method stub
        String metaDataToString = null;
        try {
            ApplicationInfo appInfo = summerApp.getPackageManager().getApplicationInfo(summerApp.getPackageName(), PackageManager.GET_META_DATA);
            if(ObjectUtil.nonNull(appInfo) && ObjectUtil.nonNull(appInfo.metaData)) {
                metaDataToString = appInfo.metaData.get(metaDataName).toString();
            }
        } catch (PackageManager.NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return metaDataToString;
    }
}
